home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 November
/
EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso
/
earcd
/
program
/
misc
/
bgui12.lha
/
Classes
/
AreaClass
/
testarea.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-06-02
|
5KB
|
212 lines
;/* Execute me to compile with DICE v3.0
dcc testarea.c -proto -mi -ms -lareaclass.o -lbgui
quit
*/
/*
** File: testarea.c
** Description: Very simple test program for the area class.
** Copyright: (C) Copyright 1994-1995 Jaba Development.
** (C) Copyright 1994-1995 Jan van den Baard.
** All Rights Reserved.
**/
#include <libraries/bgui.h>
#include <libraries/bgui_macros.h>
#include <intuition/icclass.h>
#include <clib/alib_protos.h>
#include <proto/exec.h>
#include <proto/bgui.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include "areaclass.h"
/*
** Compiler stuff.
**/
#ifdef _DCC
#define SAVEDS __geta4
#define ASM
#define REG(x) __ ## x
#else
#define SAVEDS __saveds
#define ASM __asm
#define REG(x) register __ ## x
#endif
struct Library *BGUIBase;
Class *AreaClass;
#define ID_REDRAW_AREA 1 /* When this ID is encountered we (re-)render the area. */
#define ID_QUIT 2
/*
** Simply took from the old BGUIDemo. Renders a simple
** integer mandel in the area.
**/
ULONG RenderMandel( struct Window *win, struct IBox *ibox, Object *area, Object *wd )
{
LONG zr, zi, ar, ai, dr, di, sr, si, st, x, y, i;
LONG xsize, ysize, depth, rc;
depth = win->WScreen->BitMap.Depth;
xsize = ibox->Width;
ysize = ibox->Height;
sr = 0x400000 / xsize;
si = 0x300000 / ysize;
st = 0x140000 * -2;
zi = 0x180000;
for ( y = ysize - 1; y >= 0; y-- ) {
zi -= si;
zr = st;
for ( x = 0; x < xsize; x++ ) {
i = 0;
ar = zr;
ai = zi;
do {
dr = ar >> 10;
di = ai >> 10;
ai = dr * 2 * di + zi;
dr *= dr;
di *= di;
ar = dr - di + zr;
i++;
} while (( i <= 25 ) && (( dr + di ) <= 0x400000 ));
SetAPen( win->RPort, i % ( 1 << depth ));
WritePixel( win->RPort, x + ibox->Left, y + ibox->Top );
/*
** To keep things simple I sortof duplicated
** the event handler here. It simply returns
** to the main event handler (below) when
** necessary.
**/
while (( rc = HandleEvent( wd )) != WMHI_NOMORE ) {
if ( rc == ID_REDRAW_AREA || rc == ID_QUIT || rc == WMHI_CLOSEWINDOW )
return( rc );
}
zr += sr;
}
}
return( 0L );
}
/*
** Here we go...
**/
void main( int ac, char **args )
{
struct Window *w;
Object *Win, *Area, *But;
ULONG signal, rc;
struct IBox *area_box;
BOOL running = TRUE;
if ( BGUIBase = OpenLibrary( BGUINAME, BGUIVERSION )) {
/*
** Initalize the class.
**/
if ( AreaClass = InitAreaClass()) {
/*
** Create AreaClass object.
**
** Note the usage of the ICA_TARGET attribute. This is
** required otherwise the object will never notify you
** of size changes!!
**/
Area = NewObject( AreaClass, NULL, FRM_Type, FRTYPE_BUTTON,
FRM_EdgesOnly, TRUE,
AREA_MinWidth, 40,
AREA_MinHeight, 10,
GA_ID, ID_REDRAW_AREA,
ICA_TARGET, ICTARGET_IDCMP,
TAG_END );
/*
** Make a window.
**/
Win = WindowObject,
WINDOW_Title, "AreaClass demo.",
WINDOW_AutoAspect, TRUE,
WINDOW_SmartRefresh, TRUE,
WINDOW_MasterGroup,
VGroupObject, HOffset( 4 ), VOffset( 4 ), Spacing( 4 ),
GROUP_BackFill, SHINE_RASTER,
StartMember, Area, EndMember,
StartMember, But = KeyButton( "_Quit", ID_QUIT ), FixMinHeight, EndMember,
EndObject,
EndObject;
/*
** OK?
**/
if ( Win ) {
/*
** Add gadget key.
**/
GadgetKey( Win, But, "q" );
/*
** Open the window.
**/
if ( w = WindowOpen( Win )) {
/*
** Get window signal.
**/
GetAttr( WINDOW_SigMask, Win, &signal );
/*
** Poll messages...
**/
do {
Wait( signal );
while (( rc = HandleEvent( Win )) != WMHI_NOMORE ) {
handleMsg:
switch ( rc ) {
case ID_REDRAW_AREA:
/*
** Were signalled to redraw the
** area. Obtain the area bounds.
**/
GetAttr( AREA_AreaBox, Area, ( ULONG * )&area_box );
/*
** Render inside the area.
** When this routine returns we
** evaluate the return code.
**/
if ( rc = RenderMandel( w, area_box, Area, Win ))
goto handleMsg;
break;
case WMHI_CLOSEWINDOW:
case ID_QUIT:
running = FALSE;
break;
}
}
} while ( running );
}
DisposeObject( Win );
}
FreeAreaClass( AreaClass );
}
CloseLibrary( BGUIBase );
}
}
#ifdef _DCC
int wbmain( struct WBStartup *wbs )
{
return( main( 0, wbs ));
}
#endif